package com.mz.mattress.core.voice;

import jssc.SerialPort;
import lombok.extern.slf4j.Slf4j;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

@Slf4j
public class VoiceControlProtocolManager {

    private SerialPort serialPort;

    private byte currentSequence = 0;

    // 高危命令列表（需要特殊处理的命令）
//    private static final Set<Byte> CRITICAL_COMMANDS = Set.of(
//            (byte) 0x50, // 下载固定显示内容
//            (byte) 0x51, // 参数配置
//            (byte) 0x52  // 修改参数
//            // 根据实际命令集添加更多高危命令
//    );

    private static final Set<Byte> CRITICAL_COMMANDS = new HashSet<>(Arrays.asList(
            (byte) 0x50, // 下载固定显示内容
            (byte) 0x51, // 参数配置
            (byte) 0x52  // 修改参数
    ));

    public static void main(String[] args) {

        Set<Byte> CRITICAL_COMMANDS = new HashSet<>(Arrays.asList(
                (byte) 0x50, // 下载固定显示内容
                (byte) 0x51, // 参数配置
                (byte) 0x52  // 修改参数
        ));

    }

    /**
     * 发送数据包
     * @param packet     数据包
     * @param isCritical 是否为高危操作
     */
    public void sendPacket(VoiceControlPacket packet, boolean isCritical) {
        if (serialPort == null || !serialPort.isOpened()) {
            log.error("串口未打开");
            return;
        }

        byte[] packetData = packet.toByteArray();

        if (packetData.length > 255) {
            log.error("数据包长度超过255字节限制");
            return;
        }

        try {
            // 发送数据包
            sendBytesWithInterval(packetData, 10);
            log.info("发送数据包: {}", packet);

            // 如果是高危命令，需要等待50ms以上
            if (isCritical || isCriticalCommand(packet.getCommand())) {
                log.warn("高危命令发送完成，等待50ms...");
                Thread.sleep(60); // 等待60ms，略大于50ms要求
            }

        } catch (Exception e) {
            log.error("发送数据包失败", e);
        }
    }

    /**
     * 发送字节数据，保证字节间隔不大于10ms
     */
    private void sendBytesWithInterval(byte[] data, int maxIntervalMs) {
        for (int i = 0; i < data.length; i++) {

//            serialPort.write(data[i]);

            // 如果不是最后一个字节，等待间隔
            if (i < data.length - 1) {
                try {
                    Thread.sleep(maxIntervalMs - 1); // 略小于最大间隔
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                    break;
                }
            }
        }
    }

    /**
     * 检查是否为高危命令
     */
    private boolean isCriticalCommand(byte command) {
        return CRITICAL_COMMANDS.contains(command);
    }

    /**
     * 生成下一个流水号
     */
    public byte getNextSequence() {
        return currentSequence++;
    }

    /**
     * 设置串口
     */
    public void setSerialPort(SerialPort serialPort) {
        this.serialPort = serialPort;
    }

    /**
     * 创建文本显示命令
     */
    public VoiceControlPacket createTextDisplayPacket(String text, String encoding) {
        try {
            byte[] textData = text.getBytes(encoding);
            byte sequence = getNextSequence();
            // 假设0x41是显示文本的命令，根据实际命令集修改
            return new VoiceControlPacket(sequence, (byte) 0x41, textData);
        } catch (Throwable e) {
            log.error("不支持的编码格式: {}", encoding, e);
            return null;
        }
    }

    /**
     * 接收数据包
     */
//    public VoiceControlPacket receivePacket() {
//        if (serialPort == null) {
//            return null;
//        }
//
//        try {
//            // 读取包头
//            byte[] header = new byte[2];
//            int headerBytes = serialPort.read(header, 0, 2);
//            if (headerBytes != 2 || header[0] != VoiceControlPacket.HEADER[0]
//                    || header[1] != VoiceControlPacket.HEADER[1]) {
//                return null;
//            }
//
//            // 读取剩余数据（先读取固定部分）
//            byte[] fixedPart = new byte[7]; // 流水号(1)+地址(1)+保留(1)+命令(1)+长度(2)+CRC(2)
//            int fixedBytes = serialPort.read(fixedPart, 0, 7);
//            if (fixedBytes != 7) {
//                return null;
//            }
//
//            // 解析数据长度
//            int dataLength = ((fixedPart[4] & 0xFF) << 8) | (fixedPart[5] & 0xFF);
//
//            // 读取数据部分和结束符
//            byte[] dataAndEnd = new byte[dataLength + 1]; // 数据 + 结束符
//            int dataBytes = serialPort.read(dataAndEnd, 0, dataLength + 1);
//            if (dataBytes != dataLength + 1) {
//                return null;
//            }
//
//            // 组合完整数据包
//            byte[] fullPacket = new byte[2 + 7 + dataLength + 1];
//            System.arraycopy(header, 0, fullPacket, 0, 2);
//            System.arraycopy(fixedPart, 0, fullPacket, 2, 7);
//            System.arraycopy(dataAndEnd, 0, fullPacket, 9, dataLength + 1);
//
//            return VoiceControlPacket.fromByteArray(fullPacket);
//
//        } catch (Exception e) {
//            log.error("接收数据包失败", e);
//            return null;
//        }
//    }

}